/*
 * TacticaEspinete.java
 *
 * Created on 27 de abril de 2007, 16:10
 *
 *
 *
 */

package futbol.tacticas.concursantes2007.Espinete;

import futbol.General;
import futbol.tacticas.Comando;
import futbol.tacticas.ComandoGolpearBola;
import futbol.tacticas.ComandoIrA;
import futbol.tacticas.ComandoPase;
import futbol.tacticas.ComandoTiroAPuerta;
import futbol.tacticas.SituacionJugadores;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;

/**
 *
 * @author enrique jimenez flores
 */
public class TacticaEspinete implements Tactica{

	private int goles_favor, goles_contra, defensaQuieta;
	private boolean peligro, marcador_cambiado;
	int[] ordenContrarios;
	

	private int nValores[][] = {
            {-150,  20, 6}, 	// Jugador 0  MODO_INICIAL
            {-150, -20, 5}, 	// Jugador 1  MODO_INICIAL
            {-130,  15, 5}, 	// Jugador 2  MODO_INICIAL
            {-130, -15, 5}, 	// Jugador 3  MODO_INICIAL
            {-120,   0, 5}, 	// Jugador 4  MODO_INICIAL
            { -85,  15, 5}, 	// Jugador 5  MODO_INICIAL
            { -45, -15, 5}, 	// Jugador 6  MODO_INICIAL
            {  35,   0, 7}, 	// Jugador 7  MODO_INICIAL
            {  70,  85, 7}, 	// Jugador 8  MODO_INICIAL
            {  72, -80, 7}, 	// Jugador 9  MODO_INICIAL
            { 100,   3, 7}, 	// Jugador 10 MODO_INICIAL
	};


    // constructor
    public TacticaEspinete() {
    	peligro=false;
    	marcador_cambiado = true;
    	goles_favor=0;
    	goles_contra=0;
    	defensaQuieta=15;    	
    }

    public Color getColor1() {

        return Color.PINK;
    }

    public Color getColor2() {

        return Color.PINK;
    }

    public Color getColorNumero() {

        return Color.BLACK;
    }

    public String getNombre() {
        return "Espinete";
    }

    public int getXInicial(int n) {
        return nValores[n][0];
    }

    public int getYInicial(int n) {

        return nValores[n][1];
    }

    public int getFuerza(int n) {
        return nValores[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {

        Vector<Comando> com=new Vector<Comando>();

        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();

        int bolaX = (int)sj.getBola().getX();
        int y=0, x=0;
        int bolaY = (int)sj.getBola().getY();

        //Posicionamiento

        // Detectar si ha habido gol
        if ((bolaX==0) &&  (bolaY== 0) && (!marcador_cambiado)) {
        	
        	if (peligro) {
    			peligro=false;
    			goles_contra++;
    			defensaQuieta=3;
    		} else {
    			defensaQuieta=15;
    			goles_favor++;    			
    		}
        	//System.out.println("Marcador: " + goles_favor + "-" + goles_contra);
        	
        } else {
        	peligro = (bolaX < -40);
        	if ((bolaX!=0) || (bolaY!= 0)) {
        		marcador_cambiado = false;
        	}        	
        }

        //mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();

      //MOVIMIENTO INICIAL JUGADORES
      for (int n=1;n<11;n++) {
        	com.add(new ComandoIrA(n,getXInicial(n),getYInicial(n)));
      }
      
      if (defensaQuieta==0) {
            //PORTERO 0
            if ((bolaX > -120) || ((Math.abs(bolaY) > 40))) {
                 y=(int)(bolaY/2);
                 if (y<-20) y=-19;
                 if (y>20) y=19;
                 com.add(new ComandoIrA(0,getXInicial(0), y));
            } else {
                 com.add(new ComandoIrA(0,bolaX, bolaY));
            }
	       
	    // defensa 1, 2, 3, 4
	    for (int i=1; i<5; i++) {
                if (nJug != i) {
                        if (bolaX > contrarios[ordenContrarios[i-1]].getX()) x=5; else x=-5;
                        if (bolaY > contrarios[ordenContrarios[i-1]].getY()) y=5; else y=-5;
                        com.add(new ComandoIrA(i,contrarios[ordenContrarios[i-1]].getX()+x,
                                                         contrarios[ordenContrarios[i-1]].getY()+y));
                }
	    }
                  
               
      } else {
    	  defensaQuieta--;
    	  if (defensaQuieta==0) {
    		  ordenContrarios = ordenarJugadoresX(contrarios);
    	  }
      }

       
   	//MEDIA OFENSIVA 5
            if  ((nJug != 5) && (bolaY > -10) && (bolaX < 80) && !hayCompanyero(5,bolaX,bolaY,jugadores)) {
                com.add(new ComandoIrA(5,bolaX,bolaY));
            }

            // MEDIA OFENSIVA 6
            if  ((nJug != 6) && (bolaX < 80) && (bolaY < 10) && !hayCompanyero(6,bolaX,bolaY,jugadores)) {
                com.add(new ComandoIrA(6,bolaX,bolaY));
            }    
   	   

       //LIBERO 7
       if ((nJug != 7) && (bolaX > -40) && !hayCompanyero(7,bolaX,bolaY,jugadores)) {
       	  com.add(new ComandoIrA(7,bolaX,bolaY));
       } else if ((nJug != 7) && estaCubierto(7,jugadores, contrarios)) {
    	   com.add(new ComandoIrA(7,jugadores[7].getX()-x,y));    	   
       }

       //DELANTERA 8
       if  ((nJug != 8) && (bolaY > -10) && (bolaX > 0) && !hayCompanyero(8,bolaX,bolaY,jugadores)) {
       	com.add(new ComandoIrA(8,bolaX,bolaY));
       } else if ((nJug != 8) && estaCubierto(8,jugadores, contrarios)) {
    	   com.add(new ComandoIrA(8,jugadores[8].getX()-x,jugadores[8].getY()-y)); 
       }

       // DELANTERA 9
       if  ((nJug != 9) && (bolaY < 10) && (bolaX > 0) && !hayCompanyero(9,bolaX,bolaY,jugadores)) {
       	com.add(new ComandoIrA(9,bolaX,bolaY));
       } else if ((nJug != 9) && estaCubierto(9,jugadores, contrarios)) {
    	   com.add(new ComandoIrA(9,jugadores[9].getX()-x,jugadores[9].getY()-y)); 
       }

       // DELANTERA 10
       if  ((nJug != 10) && (bolaX > 60) && !hayCompanyero(10,bolaX,bolaY,jugadores)) {
       	com.add(new ComandoIrA(10,bolaX,bolaY));
       } else if ((nJug != 10) && estaCubierto(10,jugadores, contrarios)) {
    	   com.add(new ComandoIrA(10,jugadores[10].getX()-x,jugadores[10].getY()-y)); 
       }


       //Movimiento mas cercano a la bola
       if ((nJug > 4) || (defensaQuieta==0)) {
    	   com.add(new ComandoIrA(nJug,bolaX, bolaY));    	       	   
       }
       
       // 7, 8, 9, 10
	   if (((bolaX==0) && (bolaY==0 )) || (nJug>=7)) {
			com.add(new ComandoTiroAPuerta(nJug,desvio(contrarios,bolaY)));			
	   // 0, 1, 2, 3, 4
	   } else if (nJug<5) {
		   if (bolaY < -20) {
			   if (sePuedeCentrar(nJug, 6, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,6));
			   } else if (sePuedeCentrar(nJug, 5, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,5));
			   }  else if (sePuedeCentrar(nJug, 7, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,7));
			   } else if (sePuedeCentrar(nJug, 9, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,9));
			   } else if (sePuedeCentrar(nJug, 8, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,8));
			   } else if (sePuedeCentrar(nJug, 10, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,10));
			   } else if (!hayContDelante(nJug,jugadores,contrarios)) {
				com.add(new ComandoTiroAPuerta(nJug,desvio(contrarios,bolaY)));
			   } else {
				com.add(new ComandoGolpearBola(nJug,bolaX,-120));
			   }
		   } else if (bolaY > 20) {
			   if (sePuedeCentrar(nJug, 5, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,5));
			   } else if (sePuedeCentrar(nJug, 6, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,6));
			   }  else if (sePuedeCentrar(nJug, 7, jugadores,contrarios)) {
				  com.add(new ComandoPase(nJug,7));
			   } else if (sePuedeCentrar(nJug, 8, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,8));
                           } else if (sePuedeCentrar(nJug, 9, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,9));                                        
			   } else if (sePuedeCentrar(nJug, 10, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,10));
			   } else if (!hayContDelante(nJug,jugadores,contrarios)) {
				com.add(new ComandoTiroAPuerta(nJug,desvio(contrarios,bolaY)));
			   } else {
                                com.add(new ComandoGolpearBola(nJug,bolaX,-120));
			   }
		   } else {
			   if (sePuedeCentrar(nJug, 7, jugadores,contrarios)) {
				  com.add(new ComandoPase(nJug,7));
			   } else if (sePuedeCentrar(nJug, 8, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,8));
                           } else if (sePuedeCentrar(nJug, 9, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,9));                                        
			   } else if (sePuedeCentrar(nJug, 10, jugadores,contrarios)) {
				com.add(new ComandoPase(nJug,10));
			   } else if (!hayContDelante(nJug,jugadores,contrarios)) {
				com.add(new ComandoTiroAPuerta(nJug,desvio(contrarios,bolaY)));
			   } else {
                                com.add(new ComandoGolpearBola(nJug,bolaX,-120));
			   }	   
		   }
			   			
	   // 5, 6
	   } else if (nJug < 7)  {
			if ((bolaX < -20) && (Math.abs(bolaY) < 20) && (sePuedeCentrar(nJug, 7, jugadores,contrarios))){
                            com.add(new ComandoPase(nJug,7));
			} else if ((bolaY < 0) && (sePuedeCentrar(nJug, 9, jugadores,contrarios))) {
                            com.add(new ComandoPase(nJug,9));
			} else if (sePuedeCentrar(nJug, 8, jugadores,contrarios)) {
                            com.add(new ComandoPase(nJug,8));
			} else if (sePuedeCentrar(nJug, 10, jugadores,contrarios)) {
                            com.add(new ComandoPase(nJug,10));
			} else {
                            com.add(new ComandoTiroAPuerta(nJug,desvio(contrarios,bolaY)));
			}
	   //EOC
           } else {
              com.add(new ComandoTiroAPuerta(nJug,desvio(contrarios,bolaY)));			
	   }
              
       return com;
    }

    private int[] ordenarJugadoresX(Point[] jug) {
    	int[] result = new int[11];
    	int[] jugX = new int[11];
    	int pos = 0;

    	for (int i=0; i<11; i++) {
    		jugX[i] = (int)jug[i].getX();
    	}

    	for (int i=0; i<11; i++) {
    		double menor = 200;
    		for (int j=0; j<11; j++) {
    			if (jugX[j] <= menor) {
    				pos = j;
    				menor = jugX[j];
    			}
    		}
    		jugX[pos] = 200;
    		result[i] = pos;

    	}
    	 return result;
    }

    private boolean estaCubierto(int jug,Point[] jugadores, Point[] contrario) {
        boolean cubierto = false;

        for (int i=0; i<11; i++) {
        	if (Math.abs(jugadores[jug].getX()-contrario[i].getX()) < 10 &&
        		Math.abs(jugadores[jug].getY()-contrario[i].getY()) < 10){
        		cubierto = true;
        		break;
        	}
        }
        return cubierto;
        
    }
    
    private boolean hayContDelante(int yo,Point[] jugadores, Point[] contrario) {
        boolean delante = false;

       for (int i=0; i<11; i++) {
			double x = contrario[i].getX() - jugadores[yo].getX();
			double y = Math.abs(contrario[i].getY() - jugadores[yo].getY());
			if ((x > 0) && (x < 15) && (y < 10)) {
				delante = true;
				break;
			}
	   }
	   return delante;
        
    }
   

    private boolean estaAlLado(int yo,int otro, Point[] jugadores) {
        boolean hay = false;

        if ((otro != yo) && ((jugadores[otro].getX()-jugadores[yo].getX()) < 15)) {
        	hay = true;
        }
        return hay;

    }
    
    private boolean hayCompanyero(int yo,int x, int y, Point[] jugadores) {
        boolean hay = false;

        for (int i=0; i<11; i++) {
        	if ((i != yo) && (Math.abs(x-jugadores[i].getX()) < 10) &&
                			 (Math.abs(y-jugadores[i].getY()) < 10)) {
        		hay = true;
        		break;
        	}
        }
        return hay;

    }
    
    private int desvio(Point[] contrario, int y) {
    	int resul = 0;
    		if (contrario[0].getY() < 0) {
    			resul = 15;
    		} else {
    			resul = -15;
    		}
    	return resul;
    }
    
    private boolean sePuedeCentrar(int yo, int pasarA, Point[] jugadores, Point[] contrarios) {
        return ((!estaAlLado(yo,pasarA,jugadores) && 
                (!estaCubierto(pasarA,jugadores, contrarios)) && 
                (!hayContDelante(yo,jugadores,contrarios))) );
    }

}
